package com.chukun.interview.feature.inf.impl;

import com.chukun.interview.feature.inf.base.AbstractShape;


// 正方形对象
public class ExtendSquare extends AbstractShape {

    public final double side;

    public ExtendSquare(String id, double side) {
        super(id);
        this.side = side;
    }

    @Override
    public double area() {
        return side * side;
    }

    /**
     * 判断是否是一个正方形
     * 一个对象，表示它的类是长方形或者菱形的类。如果这个对象的每一个边的长度都是一样的，其实它就是一个正方形，
     * 但是表示它的类是长方形或者菱形的类，而不是正方形类。所以，并不总是能够正确判断一个形状是不是正方形。
     * @param shape
     * @return
     */
    public static boolean isSquare01(AbstractShape shape) {
        return (shape instanceof ExtendSquare);
    }

    /**
     * 改进是否是正方形的方法，还是有缺陷
     * 正方形也是一个特殊的菱形，如果一个对象是一个菱形类的实例，代码就有缺陷。更令人窘迫的是，正方形还是一个特殊的梯形，还是一个特殊的多边形
     *
     * 无限制的扩展性，是问题的根源
     * 解决问题的办法，就是限制可扩展类的扩展性
     * @param shape
     * @return
     */
    public static boolean isSquare02(AbstractShape shape) {
        // 若当前为长方形，需要判断长方形的长与宽是否相等
        if (shape instanceof ExtendRectangle rect) {
            return rect.width == rect.length;
        }
        return (shape instanceof ExtendSquare);
    }
}